package models

import (
	"context"
	"go-chain-api/global"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/bson/primitive"
	"gorm.io/gorm"
)

type ChainConfig struct {
	ChainID         uint     `gorm:"not null;unique_index"`      // 链的唯一标识符
	ChainName       string   `gorm:"type:varchar(100);not null"` // 链的名称
	CoinName        string   `gorm:"type:varchar(100)"`
	RrcUrls         []RpcUrl `gorm:"foreignKey:ChainID;references:ChainID"` // 链的RPC URL列表，与RrcUrl建立一对多关联
	IsScan          uint     `gorm:""`                                      // 是否扫描标志
	LastBlockNumber uint64   `gorm:"type:varchar(100);"`                    // 记录该链上最后处理的区块号
	UdunId          uint64   // udun的id
}

type Body struct {
	MerchantId   string // 商户号  即用户id
	MainCoinType uint   // 币种id
	CallUrl      string // 回调地址
	Address      string // 提幣地址
	Amount       string // 提幣數量
	CoinType     string // 代币id
	BusinessId   string // 業務編號
	Memo         string // 備註
	TokenAddress string //代币地址
}

type RpcUrl struct {
	gorm.Model
	Url      string `gorm:"type:text;not null"` // RPC URL地址
	ChainID  uint   `gorm:"foreignKey:ChainID"` // 外键，指向ChainConfig
	Host     string // 主机名
	Port     uint   // 端口
	Currency string // 国家
	Client   string // 客户端
	NodeType string // 节点类型
	System   string // 操作系统
}

type RequestBody struct {
	MainCoinType int64  `json:"mainCoinType"`
	CallUrl      string `json:"callUrl"`
	Address      string `json:"address"`
	Amount       string `json:"amount"`
	BusinessID   string `json:"businessId"` // 注意Go中通常使用驼峰式命名法
	CoinType     string `json:"coinType"`
	Memo         string `json:"memo"`
	MerchantId   string `json:"merchantId"`
}

// Request 结构体对应于整个JSON对象
type RequestParam struct {
	Body      string `json:"body"`
	Nonce     string `json:"nonce"`
	Timestamp string `json:"timestamp"` // 假设时间戳是整数类型
	Sign      string `json:"sign"`
	Type      string `json:"type"`      //0：用户购买会员时用 1.用户自己生成地址时用
	ProductId string `json:"productId"` //产品id
}

type ChainData struct {
	ChainName     string `bson:"chainName" json:"chainName"`
	ChainConfigId string `bson:"chainConfigId" json:"chainConfigId"`
	ChainId       uint64 `bson:"chainId" json:"chainId"`
}

func (c *ChainConfig) ApiList(userId string) ([]ChainData, error) {
	model := new(ChainToChain)
	model.UserId = userId
	list, err := model.ApiList(userId)

	// 提取chainConfigId0到数组
	chainConfigIds := make(map[string]bool)
	for _, result := range list {
		chainConfigIds[result["chainConfigId1"].(string)] = true
		chainConfigIds[result["chainConfigId0"].(string)] = true
	}

	//cfg := configs.Get().Mongodb
	configClient := global.DBEngine.Database(global.DbConfig.DbName).Collection("chain_config")

	var Data struct {
		ChainName string `bson:"chainName" json:"chainName"`
		ChainId   uint64 `bson:"chainId" json:"chainId"`
	}

	var chainDataList []ChainData
	for key := range chainConfigIds {
		objId, _ := primitive.ObjectIDFromHex(key)
		_ = configClient.FindOne(context.TODO(), bson.D{{"_id", objId}}).Decode(&Data)

		var chainData ChainData
		chainData.ChainName = Data.ChainName
		chainData.ChainConfigId = key
		chainData.ChainId = Data.ChainId
		chainDataList = append(chainDataList, chainData)
	}

	return chainDataList, err
}
